package org.lc.stk.service.baseInfo;

import java.util.List;

import org.lc.stk.model.baseInfo.MajorCengci;
import org.lc.stk.web.dto.majorcengci.CreateMajorCengciRequest;
import org.lc.stk.web.dto.majorcengci.MajorCengciQuery;
import org.lc.stk.web.dto.majorcengci.UpdateMajorCengciRequest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * 专业层次关联服务接口
 */
public interface MajorCengciService {
    
    /**
     * 创建专业层次关联
     * @param request 创建请求
     * @return 创建的专业层次关联
     * @throws BusinessException 如果专业或培养层次不存在，或已存在相同的关联
     */
    MajorCengci create(CreateMajorCengciRequest request);
    
    /**
     * 更新专业层次关联
     * @param request 更新请求
     * @return 更新后的专业层次关联
     * @throws BusinessException 如果关联不存在，或更新后会导致重复关联
     */
    MajorCengci update(UpdateMajorCengciRequest request);
    
    /**
     * 删除专业层次关联
     * @param id 关联ID
     * @throws BusinessException 如果关联不存在
     */
    void delete(Integer id);
    
    /**
     * 批量删除专业的培养层次关联
     * @param majorId 专业ID
     * @return 删除的记录数
     */
    int deleteByMajorId(Integer majorId);
    
    /**
     * 批量删除培养层次的专业关联
     * @param cengciId 培养层次ID
     * @return 删除的记录数
     */
    int deleteByCengciId(Integer cengciId);
    
    /**
     * 根据ID获取专业层次关联
     * @param id 关联ID
     * @return 专业层次关联
     * @throws BusinessException 如果关联不存在
     */
    MajorCengci getById(Integer id);
    
    /**
     * 获取专业的所有培养层次关联
     * @param majorId 专业ID
     * @return 关联列表
     */
    List<MajorCengci> getByMajorId(Integer majorId);
    
    /**
     * 获取培养层次的所有专业关联
     * @param cengciId 培养层次ID
     * @return 关联列表
     */
    List<MajorCengci> getByCengciId(Integer cengciId);
    
    /**
     * 分页查询专业层次关联
     * @param query 查询条件
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<MajorCengci> query(MajorCengciQuery query, Pageable pageable);
    
    /**
     * 检查专业和培养层次的关联是否已存在
     * @param majorId 专业ID
     * @param cengciId 培养层次ID
     * @param excludeId 排除的ID
     * @return true if exists
     */
    boolean exists(Integer majorId, Integer cengciId, Integer excludeId);
}